package cn.chengpengper.shortlink.util;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;

/**
 * @author huchengpeng
 * @version 1.0.0
 * @date 2023/6/18 21:15
 * @description 时间工具类
 */
public class TimeUtil {

    /**
     * 默认日期格式
     */
    private static final String DEFAULT_PATTERN = "yyyy-MM-dd HH:mm:ss";

    /**
     * 默认日期格式
     */
    private static final DateTimeFormatter DEFAULT_DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern(DEFAULT_PATTERN);

    private static final ZoneId DEFAULT_ZONE_ID = ZoneId.systemDefault();

    /**
     * LocalDateTime 转字符串，指定日期格式
     *
     * @param time    time
     * @param pattern 日期格式
     * @return String 指定格式的时间字符串
     */
    public static String format(LocalDateTime time, String pattern) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        return formatter.format(time.atZone(DEFAULT_ZONE_ID));
    }

    /**
     * Date 转字符串，指定日期格式
     *
     * @param time    localDateTime
     * @param pattern 日期格式
     * @return String 指定格式的时间字符串
     */
    public static String format(Date time, String pattern) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        return formatter.format(time.toInstant().atZone(DEFAULT_ZONE_ID));
    }

    /**
     * Date 转字符串，默认日期格式
     *
     * @param time time
     * @return String 指定格式的时间字符串
     */
    public static String format(Date time) {
        return DEFAULT_DATE_TIME_FORMATTER.format(time.toInstant().atZone(DEFAULT_ZONE_ID));
    }

    /**
     * 时间戳转字符串，默认日期格式
     *
     * @param timestamp 时间戳
     * @return String 指定格式的时间字符串
     */
    public static String format(Long timestamp) {
        return DEFAULT_DATE_TIME_FORMATTER.format(new Date(timestamp).toInstant().atZone(DEFAULT_ZONE_ID));
    }

    /**
     * 默认日期格式的字符串转 Date
     *
     * @param time 默认日期格式的字符串
     * @return Date date
     */
    public static Date strToDate(String time) {
        LocalDateTime localDateTime = LocalDateTime.parse(time, DEFAULT_DATE_TIME_FORMATTER);
        return Date.from(localDateTime.atZone(DEFAULT_ZONE_ID).toInstant());
    }

    /**
     * 获取当天剩余的秒数，用于流量包过期配置
     *
     * @param currentDate 当前时间
     * @return Integer 剩余秒数
     */
    public static Integer getRemainSecondsOneDay(Date currentDate) {
        LocalDateTime midnight = LocalDateTime.ofInstant(currentDate.toInstant(), DEFAULT_ZONE_ID)
                .plusDays(1)
                .withHour(0)
                .withMinute(0)
                .withSecond(0)
                .withNano(0);

        LocalDateTime currentDateTime = LocalDateTime.ofInstant(currentDate.toInstant(), DEFAULT_ZONE_ID);

        long seconds = ChronoUnit.SECONDS.between(currentDateTime, midnight);
        return ((int) seconds);
    }
}
